package cn.tedu.oop;

/**
 * @Author 金帮嘉诚
 * @Date 2021-06-11 周五 10:10
 */
/*本类用于抽象测试的入门案例*/
public class AbstractDemo {
    public static void main(String[] args) {
        /*抽象类不可以实例化！！！-（创建对象）*/
//        Animal animal=new Animal();'Animal' is abstract; cannot be instantiated   instantiated实例化
//        animal.fly();
        //体现多态
        Animal a=new Pig();
        a.fly();
        a.fly2();
        a.eat();
        a.play();
        Pig pig = new Pig();
        pig.fly();
        pig.fly2();
        pig.eat();
        pig.play();
    }
}

//
/*2.被abstract修饰的类是抽象类，
如果一个类中包含了抽象方法，那这个类必须被声明成抽象类
*/
abstract class Animal {
    //
    public void eat() {
        System.out.println("Animal eat 吃啥都行~");
    }

    public void play() {
        System.out.println("Animal Play 玩啥都行~");
    }

    /*1.被abstract修饰的方法是抽象方法，抽象方法没有方法体*/
    public abstract void fly();

    public abstract void fly2();
}

//
//继承抽象类的类
// 必须是抽象类
// 或实现抽象类中的所有的抽象方法
/*3.当一个子类继承了抽象父类以后，由两种解决方案
 * 方案一：变成抽象子类，“躺平，我也不实现，继续抽象”
 * 方案二：实现抽象父类中的 所有的 抽象方法，“父债子偿”
 * */
//abstract class Pig extends Animal{//方案一
class Pig extends Animal {//Class 'Pig' must either be declared abstract or implement abstract method 'fly()' in 'Animal'
//implement实现
    @Override//注解，标识这是一个重写的方法
    public void fly() {
        System.out.println("Pig Pay Off 我爸的债终于还清了，我家的猪终于飞起来了");
    }

    @Override
    public void fly2() {

    }
}

abstract class Dog {

}